package gestorvideoclub.jdbc;

import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;
import java.util.*;
import gestorvideoclub.*;
import gestorvideoclub.jdbc.AccesoDatos;
import gestorvideoclub.Cliente;
import gestorvideoclub.enumeraciones.*;
import gestorvideoclub.util.UtilFecha;

public class ClienteJDBC {

    public static void insertarUsuario(Cliente cliente) {

        String sql;

        int idFranquicia = 1;

        sql = "insert into usuarios (nombre, apellidos, dni, contrasenya, fechaAlta, ";
        sql += "fechaBaja, telefono, saldo, estadoUsuario, id_franquicia, fechaNacimiento, numProdAlqAct, numMaxProd, tipoUsuario)";
        sql += " values('" + cliente.getNombre() + "', '" + cliente.getApellidos() + "','" + cliente.getDNI() + "'";
        sql += ",'" + cliente.getContrasenya() + "','" + UtilFecha.fechaMySQL(cliente.getFechaAlta()) + "', '" + UtilFecha.fechaMySQL(cliente.getFechaBaja()) + "'";
        sql += ", '" + cliente.getTelefono() + "'," + cliente.getSaldo() + ",'" + cliente.getEstadoUsuario() + "'";
        sql += ", " + idFranquicia + ",'" + UtilFecha.fechaMySQL(cliente.getFechaNacimiento()) + "',";
        sql += cliente.getNumProdAlqActual() + "," + cliente.getNumMaxProducto() + ",'" + cliente.getRol() + "')";



        Connection con = null;
        Statement st = null;

        try {
            con = AccesoDatos.getConexion();
            st = con.createStatement();
            st.executeUpdate(sql);
            st.close();
            System.out.println("El cliente se ha insertardo correctamente");
        } catch (Exception e) {
            System.out.println("Error al insertar un nuevo usuario " + e.getMessage());
        }
        finally{
            AccesoDatos.cerrarConexion(con);
        }
    }

    public static Cliente obtenerClientePorDni(String dni) {
        Cliente cliente = null;
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;
        
        String sql = "select * from usuarios where usuarios.dni ='"+dni+"' and tipoUsuario = 'Cliente'";
        //System.out.println(sql);
        try {
            con = AccesoDatos.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);
           
           if(rs.next()){
                cliente = new Cliente();
                cliente.setId(rs.getInt("Id"));
                cliente.setNombre(rs.getString("nombre"));
                cliente.setApellidos(rs.getString("apellidos"));
                cliente.setDNI(dni);
                String d = rs.getString("fechaAlta");
                cliente.setFechaAlta(UtilFecha.obtenerFechaBD(d));
                d = rs.getString("fechaBaja");
                cliente.setFechaBaja(UtilFecha.obtenerFechaBD(d));
                cliente.setTelefono(rs.getString("telefono"));
                cliente.setSaldo(rs.getFloat("saldo"));
                d = rs.getString("estadoUsuario");
                cliente.setEstadoUsuario(EstadoUsuario.valueOf(d));
                d = rs.getString("fechaNacimiento");
                cliente.setFechaNacimiento(UtilFecha.obtenerFechaBD(d));
                cliente.setNumProdAlqActual(rs.getInt("numProdAlqAct"));
                cliente.setNumMaxProducto(rs.getInt("numMaxProd"));

                String rol = rs.getString("tipoUsuario");
                if (rol.equals("Cliente") ) {
                    cliente.setRol(Rol.Cliente);
                } else if (rol.equals("Administrador")) {
                    cliente.setRol(Rol.Administrador);
                } else if (rol.equals("Jefe")) {
                    cliente.setRol(Rol.Jefe);
                }
            }
            st.close();
            rs.close();
        } catch (Exception e) {
            System.out.println("Error al obtener el usuario " + e.getMessage());
        }
        finally{
            AccesoDatos.cerrarConexion(con);
        }
        return cliente;
    }


    public static int obtenerIdClientePorDNI(String dni) {
        int idCliente = -1;
        String sql = "select * from usuarios where dni = " + dni + " and tipoUsuario = 'Cliente' ";
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;
        try {
            con = AccesoDatos.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);
            if(rs.next()){
                idCliente = rs.getInt("Id");
            }
            rs.close();
            st.close();

        }
        catch (Exception e) {
            System.out.println("[!] Error al obtener el identificador del cliente "+e.getMessage());
        }
        finally{
            AccesoDatos.cerrarConexion(con);
        }
        return idCliente;
    }



    public static Cliente obtenerClientePorId(int id){
        Cliente cliente = new Cliente();
        Connection con = null;
        String sql = "select * from usuarios where Id = "+id;
        Statement st = null;
        ResultSet rs = null;
        try{
            con = AccesoDatos.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);

            while(rs.next()){
                cliente.setId(rs.getInt("Id"));
                cliente.setNombre(rs.getString("nombre"));
                cliente.setApellidos(rs.getString("apellidos"));
                cliente.setDNI(rs.getString("dni"));
                cliente.setSaldo(rs.getFloat("saldo"));
                String tex = rs.getString("fechaAlta");
                cliente.setFechaAlta(UtilFecha.obtenerFechaBD(tex));
                tex = rs.getString("fechaBaja");
                cliente.setFechaBaja(UtilFecha.obtenerFechaBD(tex));
                cliente.setEstadoUsuario(EstadoUsuario.valueOf(rs.getString("estadoUsuario")));
                tex = rs.getString("fechaNacimiento");
                cliente.setFechaNacimiento(UtilFecha.obtenerFechaBD(tex));
                // franquicia
                cliente.getNumMaxProducto();
                cliente.setNumProdAlqActual(rs.getInt("numProdAlqAct"));
            }
            rs.close();
            st.close();
        }
        catch(Exception e){
            System.out.println("Error al obtener cliente por su identificador "+e.getMessage());
        }
        finally{
            AccesoDatos.cerrarConexion(con);
        }
        return cliente;
    }

    public static void modificarCliente(Cliente cliente){
        String sql = "update usuarios set nombre = '"+cliente.getNombre()+"', ";
        sql += " apellidos = '"+cliente.getApellidos()+"', dni = '"+cliente.getDNI()+"', ";
        sql += " fechaAlta = '"+UtilFecha.fechaMySQL(cliente.getFechaAlta())+"', ";
        sql += " fechaBaja = '"+UtilFecha.fechaMySQL(cliente.getFechaBaja())+"', ";
        sql += " telefono = '"+cliente.getTelefono()+"', ";
        sql += " saldo = "+cliente.getSaldo()+", ";
        sql += " estadoUsuario = '"+cliente.getEstadoUsuario()+"' , ";
        sql += " fechaNacimiento = '"+UtilFecha.fechaMySQL(cliente.getFechaNacimiento())+"', ";
        sql += " numProdAlqAct = "+cliente.getNumProdAlqActual();
        sql += " where Id = "+cliente.getId();


        //System.out.println(sql);
        Connection con = null;
        Statement st = null;
        try{
            con = AccesoDatos.getConexion();
            st = con.createStatement();
            st.executeUpdate(sql);
            st.close();
        }
        catch(Exception e){
            System.out.println("[!] Error al actualizar los datos del cliente "+e.getMessage());
        }
        finally{
            AccesoDatos.cerrarConexion(con);
        }
    }


    /**
     * Este método hace una selección de todos los usuarios de la bd
     * según el criterio buscará con un criterio u otro(estado, rol...)
     */
    public static ArrayList seleccionerTodosUsuarios(int criterio){
        ArrayList<Cliente> lista = new ArrayList<Cliente>();
        String sql = "Select * from usuarios where tipoUsuario='Cliente'";

        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        try{
            con = AccesoDatos.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);

            while(rs.next()){
                Cliente cliente = new Cliente();
                cliente.setId(rs.getInt("Id"));
                cliente.setNombre(rs.getString("nombre"));
                cliente.setApellidos(rs.getString("apellidos"));
                cliente.setDNI(rs.getString("dni"));
                String tex = rs.getString("fechaAlta");
                cliente.setFechaAlta(UtilFecha.obtenerFechaBD(tex));
                tex = rs.getString("fechaBaja");
                cliente.setFechaBaja(UtilFecha.obtenerFechaBD(tex));
                cliente.setTelefono(rs.getString("telefono"));
                cliente.setSaldo(rs.getDouble("saldo"));
                cliente.setEstadoUsuario(EstadoUsuario.valueOf(rs.getString("estadoUsuario")));
                tex = rs.getString("fechaNacimiento");
                cliente.setFechaNacimiento(UtilFecha.obtenerFechaBD(tex));
                cliente.setNumProdAlqActual(rs.getInt("numProdAlqAct"));
                cliente.setNumMaxProducto(rs.getInt("numMaxProd"));
                cliente.setRol(Rol.valueOf(rs.getString("tipoUsuario")));
                lista.add(cliente);
            }
            rs.close();
            st.close();
        }
        catch(Exception e){
            System.out.println("Error al obtener todos los Clientes "+e.getMessage());
        }
        finally{
            AccesoDatos.cerrarConexion(con);
        }
        return lista;
    }

    public static void modificarSaldoCliente(Cliente cliente){
        String sql = "update usuarios set saldo = "+cliente.getSaldo()+" where ";
        sql += " Id ="+cliente.getId()+" and tipoUsuario = 'Cliente'";

        Connection con = null;
        Statement st = null;

        try{
            con = AccesoDatos.getConexion();
            st = con.createStatement();
            st.executeUpdate(sql);
            st.close();
        }
        catch(Exception e){
            System.out.println("[!] Error al modificar el saldo "+e.getMessage());
        }
        finally{
            AccesoDatos.cerrarConexion(con);
        }
    }
}
